 
 const MGraph = require('./邻接表')
 const g = new MGraph(['A', 'B', 'C', 'D'], [{i: 0, j: 1, wei: 10}, {i: 0, j: 3, wei: 30}, {i: 1, j: 3, wei: 20}, {i: 3, j: 2, wei: 40}, {i: 2, j: 0, wei: 50}], '2')

 const visited = [] // 访问标志数组，0 未被访问过，1 访问过
 for (let i = 0; i < g.data.length; i++) {
     visited[i] = 0
 }

 const queue = [] // 队列，用于入队和出队已经被访问过的节点
 
 /**
  * 广度优先遍历图
  * @param {*} g 图
  * @param {*} v 图的某一个顶点在顶点表中的下标
  */
 function bfs(g, v) {
    console.log(g.data[v].data);
    visited[v] = 1
    queue.push(v)
    while(queue.length > 0) {
        v =  queue.shift()
        let w = firstadj(g, v)
        while(w) {   
            if(visited[w] === 0) {
                console.log(g.data[w].data);
                visited[w] = 1
                queue.push(w)
            }
            w = nextadj(g, v, w)
        }
    }
 }

 /**
 * 邻接表中获取图g中顶点表中下标为v的第一条边
 * 存在的话返在边中的下标信息，否则返回null
 * @param {*} g 图
 * @param {*} v 弧尾顶点
 */
function firstadj(g, v) {
    const e = g.data[v].firstEdge
    if (e) {
        return e.index
    } else {
        return null
    }
}

/**
 * 邻接表中获取图g中顶点表中下标为v的链表中链表节点属性index == w节点的下一个节点
 * 有返回 该节点的 index属性值，否则返回 null
 * @param {*} g 图
 * @param {*} v 弧尾顶点
 * @param {*} w 前一个顶点的下标
 */
function nextadj(g, v, w) {
    let e = g.data[v].firstEdge
    
    while (e | e.index != w) {
        e = e.nextCNode
    }
    if (e && e.nextCNode) {
        return e.nextCNode.index
    } else {
        return null
    }
}


bfs(g, 0)